home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / comm / mail / Mutt089src.lha / Mutt-0.89i-AMIGA / src / headers.c < prev    next >
C/C++ Source or Header  |  1998-01-28  |  5KB  |  189 lines

  1. /* 
  2.  * Copyright (C) 1996-8 Michael R. Elkins <me@cs.hmc.edu>
  3.  * 
  4.  *     This program is free software; you can redistribute it and/or modify
  5.  *     it under the terms of the GNU General Public License as published by
  6.  *     the Free Software Foundation; either version 2 of the License, or
  7.  *     (at your option) any later version.
  8.  * 
  9.  *     This program is distributed in the hope that it will be useful,
  10.  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *     GNU General Public License for more details.
  13.  * 
  14.  *     You should have received a copy of the GNU General Public License
  15.  *     along with this program; if not, write to the Free Software
  16.  *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  */
  18.  
  19. #include "mutt.h"
  20. #include "send.h"
  21. #include "parse.h"
  22.  
  23. #include <sys/stat.h>
  24. #include <string.h>
  25. #include <ctype.h>
  26.  
  27. void mutt_edit_headers (const char *editor,
  28.             const char *body,
  29.             HEADER * msg,
  30.             char *fcc,
  31.             size_t fcclen)
  32. {
  33.   char path[_POSIX_PATH_MAX];    /* tempfile used to edit headers + body */
  34.   char buffer[LONG_STRING];
  35.   char *p;
  36.   FILE *ifp, *ofp;
  37.   int i, keep;
  38.   int in_reply_to = 0;    /* did we see the in-reply-to field ? */
  39.   ENVELOPE *n;
  40.   time_t mtime;
  41.   struct stat st;
  42.   LIST *cur, *last = NULL, *tmp;
  43.  
  44.   mutt_mktemp (path);
  45.   if ((ofp = fopen (path, "w")) == NULL)
  46.   {
  47.     mutt_perror (path);
  48.     return;
  49.   }
  50.  
  51.   mutt_write_rfc822_header (ofp, msg->env, NULL, 1);
  52.   fputc ('\n', ofp);    /* tie off the header. */
  53.  
  54.   /* now copy the body of the message. */
  55.   if ((ifp = fopen (body, "r")) == NULL)
  56.   {
  57.     mutt_perror (body);
  58.     return;
  59.   }
  60.  
  61.   mutt_copy_stream (ifp, ofp);
  62.  
  63.   fclose (ifp);
  64.   fclose (ofp);
  65.  
  66.   if (stat (path, &st) == -1)
  67.   {
  68.     mutt_perror (path);
  69.     return;
  70.   }
  71.  
  72.   mtime = st.st_mtime;
  73.   mutt_edit_file (editor, path);
  74.   stat (path, &st);
  75.   if (mtime == st.st_mtime)
  76.   {
  77.     dprint (1, (debugfile, "ci_edit_headers(): temp file was not modified.\n"));
  78.     /* the file has not changed! */
  79.     mutt_unlink (path);
  80.     return;
  81.   }
  82.  
  83.   mutt_unlink (body);
  84.   mutt_free_list (&msg->env->userhdrs);
  85.  
  86.   /* Read the temp file back in */
  87.   ifp = fopen (path, "r");
  88.   ofp = fopen (body, "w");
  89.   n = mutt_read_rfc822_header (ifp, NULL);
  90.   while ((i = fread (buffer, 1, sizeof (buffer), ifp)) > 0)
  91.     fwrite (buffer, 1, i, ofp);
  92.   fclose (ofp);
  93.   fclose (ifp);
  94.   mutt_unlink (path);
  95.  
  96.   /* restore old info. */
  97.   n->references = msg->env->references;
  98.   msg->env->references = NULL;
  99.   mutt_free_envelope (&msg->env);
  100.   msg->env = n;
  101.  
  102.   msg->env->to = mutt_expand_aliases (msg->env->to);
  103.   msg->env->cc = mutt_expand_aliases (msg->env->cc);
  104.   msg->env->bcc = mutt_expand_aliases (msg->env->bcc);
  105.   msg->env->reply_to = mutt_expand_aliases (msg->env->reply_to);
  106.  
  107.   if (option (OPTUSEFROM) && !msg->env->from)
  108.     msg->env->from = mutt_default_from ();
  109.  
  110.   /* search through the user defined headers added to see if either a * fcc:
  111.    * or attach-file: field was specified.
  112.    */
  113.   cur = msg->env->userhdrs;
  114.   while (cur)
  115.   {
  116.     keep = 1;
  117.  
  118.     /* keep track of whether or not we see the in-reply-to field.  if we did
  119.      * not, remove the references: field later so that we can generate a new
  120.      * message based upon this one.
  121.      */
  122.     if (strncasecmp ("in-reply-to:", cur->data, 12) == 0)
  123.       in_reply_to = 1;
  124.     else if (fcc && strncasecmp ("fcc:", cur->data, 4) == 0)
  125.     {
  126.       p = cur->data + 4;
  127.       SKIPWS (p);
  128.       if (*p)
  129.       {
  130.     strfcpy (fcc, p, fcclen);
  131.     mutt_pretty_mailbox (fcc);
  132.       }
  133.       keep = 0;
  134.     }
  135.     else if (strncasecmp ("attach:", cur->data, 7) == 0)
  136.     {
  137.       BODY *body;
  138.       BODY *parts;
  139.       char *q;
  140.  
  141.       p = cur->data + 7;
  142.       SKIPWS (p);
  143.       if (*p)
  144.       {
  145.     if ((q = strpbrk (p, " \t")))
  146.     {
  147.       mutt_substrcpy (path, p, q, sizeof (path));
  148.       SKIPWS (q);
  149.     }
  150.     else
  151.       strfcpy (path, p, sizeof (path));
  152.     mutt_expand_path (path, sizeof (path));
  153.     if ((body = mutt_make_attach (path)))
  154.     {
  155.       body->description = safe_strdup (q);
  156.       for (parts = msg->content; parts->next; parts = parts->next) ;
  157.       parts->next = body;
  158.     }
  159.     else
  160.     {
  161.       mutt_pretty_mailbox (path);
  162.       mutt_error ("%s: unable to attach file", path);
  163.     }
  164.       }
  165.       keep = 0;
  166.     }
  167.  
  168.     if (keep)
  169.     {
  170.       last = cur;
  171.       cur = cur->next;
  172.     }
  173.     else
  174.     {
  175.       if (last)
  176.     last->next = cur->next;
  177.       else
  178.     msg->env->userhdrs = cur->next;
  179.       tmp = cur;
  180.       cur = cur->next;
  181.       tmp->next = NULL;
  182.       mutt_free_list (&tmp);
  183.     }
  184.   }
  185.  
  186.   if (!in_reply_to)
  187.     mutt_free_list (&msg->env->references);
  188. }
  189.